import json
import plotly
import plotly.graph_objs as go
import numpy as np
from numpy.fft import fft, ifft
import math
eps = 1e-3
def plot_signal_and_fft(signal, name, N=20, asFigure=False):
f = fft(signal)
N = min(N, len(signal) / 2)
x = np.arange(-N, N)
y = np.concatenate((f[-N:], f[:N]))
f[N:len(f) - N] = 0
signal_reconstructed = ifft(f).real
data = [go.Scatter(x=np.arange(-len(signal), len(signal)),
y=np.concatenate((signal, signal)),
name='Discrete signal'),
go.Scatter(x=np.arange(-len(signal), len(signal)),
y=np.concatenate(
(signal_reconstructed, signal_reconstructed)),
name='Signal reconstructed from truncated FFT'),
go.Bar(x=x, y=y.real,
name='Fourier transform (real part)',
xaxis='x2', yaxis='y2'),
go.Bar(x=x, y=y.imag,
name='Fourier transform (imaginary part)',
xaxis='x2', yaxis='y2')]
layout = go.Layout(title='Fourier transform for {}'.format(name),
barmode='stack',
xaxis=dict(domain=[0, .45]),
xaxis2=dict(domain=[.55, 1]),
yaxis=dict(title='amplitude'),
yaxis2=dict(anchor='x2'),
legend=dict(orientation='h'))
fig = dict(data=data, layout=layout)
return json.dumps(fig, cls=plotly.utils.PlotlyJSONEncoder)